home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / m7recv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-10  |  1.9 KB  |  136 lines

  1. #include <ctype.h>
  2. #include "statetbl.h"
  3. #include "ttyio.h"
  4. #include "lutil.h"
  5.  
  6. static int m7_recv(void);
  7. static char* fn;
  8. static int last;
  9.  
  10. int m7recv(char*);
  11. int m7recv(fname)
  12. char *fname;
  13. {
  14.     int rc;
  15.  
  16.     fn=fname;
  17.     last=0;
  18.     rc=m7_recv();
  19.     if (rc) return -1;
  20.     else if (last) return 1;
  21.     else return 0;
  22. }
  23.  
  24. SM_DECL(m7_recv,"m7recv")
  25. SM_STATES
  26.     sendnak,waitack,waitchar,sendack,sendcheck,waitckok
  27. SM_NAMES
  28.     "sendnak","waitack","waitchar","sendack","sendcheck","waitckok"
  29. SM_EDECL
  30.  
  31.     int count=0;
  32.     int c,i=0;
  33.     char *p=fn;
  34.     char cs=0;
  35.  
  36. SM_START(waitchar)
  37.  
  38. SM_STATE(sendnak)
  39.  
  40.     if (count++ > 6)
  41.     {
  42.         loginf("too many tries getting modem7 name");
  43.         SM_ERROR;
  44.     }
  45.     p=fn;
  46.     cs=SUB;
  47.     i=0;
  48.     PUTCHAR(NAK);
  49.     if (STATUS) {SM_ERROR;}
  50.     else {SM_PROCEED(waitack);}
  51.  
  52. SM_STATE(waitack)
  53.  
  54.     c=GETCHAR(15);
  55.     if (c == TIMEOUT)
  56.     {
  57.         debug(11,"m7 got timout waiting for ACK");
  58.         SM_PROCEED(sendnak);
  59.     }
  60.     else if (c < 0)
  61.     {
  62.         SM_ERROR;
  63.     }
  64.     else switch (c)
  65.     {
  66.     case ACK:    SM_PROCEED(waitchar); break;
  67.     case EOT:    last=1; SM_SUCCESS; break;
  68.     default:    debug(11,"m7 got '%s' waiting for ACK",
  69.                 printablec(c));
  70.             break;
  71.     }
  72.  
  73. SM_STATE(waitchar)
  74.  
  75.     c=GETCHAR(15);
  76.     if (c == TIMEOUT)
  77.     {
  78.         debug(11,"m7 got timeout waiting for char",c);
  79.         SM_PROCEED(sendnak);
  80.     }
  81.     else if (c < 0)
  82.     {
  83.         SM_ERROR;
  84.     }
  85.     else switch (c)
  86.     {
  87.     case EOT:    last=1; SM_SUCCESS; break;
  88.     case SUB:    *p='\0'; SM_PROCEED(sendcheck); break;
  89.     case 'u':    SM_PROCEED(sendnak); break;
  90.     default:    cs+=c;
  91.             if (i < 15)
  92.             {
  93.                 if (c != ' ')
  94.                 {
  95.                     if (i == 8) *p++='.';
  96.                     *p++=tolower(c);
  97.                 }
  98.                 i++;
  99.             }
  100.             SM_PROCEED(sendack); break;
  101.     }
  102.  
  103. SM_STATE(sendack)
  104.  
  105.     PUTCHAR(ACK);
  106.     SM_PROCEED(waitchar);
  107.  
  108. SM_STATE(sendcheck)
  109.  
  110.     PUTCHAR(cs);
  111.     SM_PROCEED(waitckok);
  112.  
  113. SM_STATE(waitckok)
  114.  
  115.     c=GETCHAR(15);
  116.     if (c == TIMEOUT)
  117.     {
  118.         debug(11,"m7 got timout waiting for ack ACK");
  119.         SM_PROCEED(sendnak);
  120.     }
  121.     else if (c < 0)
  122.     {
  123.         SM_ERROR;
  124.     }
  125.     else if (c == ACK)
  126.     {
  127.         SM_SUCCESS;
  128.     }
  129.     else
  130.     {
  131.         SM_PROCEED(sendnak);
  132.     }
  133.  
  134. SM_END
  135. SM_RETURN
  136.